package br.boicotando.client;

import br.boicotando.dominio.Cliente;
import br.boicotando.dominio.Endereco;
import br.boicotando.dominio.Sexo;
import br.boicotando.shared.Util;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextBox;

public class TelaCadastroCliente extends Composite {
	private String idCliente;
	private final GerenciadorClienteAsync gerenciadorCliente = GWT.create(GerenciadorCliente.class);
	private final HorizontalPanel panel = new HorizontalPanel();
	private final FormPanel loginForm = new FormPanel();
	private final FormPanel clienteForm = new FormPanel();
	private final HTML loginTitulo = new HTML();
	private final HTML clienteTitulo = new HTML();
	private final HTML clienteDadosTitulo = new HTML("<h5>Dados pessoais<h5>");
	private final HTML clienteLoginTitulo = new HTML("<h5>Dados de acesso<h5>");
	private final FlexTable loginTable = new FlexTable();
	private final FlexTable clienteTable = new FlexTable();
	private final TextBox loginEMail = new TextBox();
	private final PasswordTextBox loginSenha = new PasswordTextBox();
	private final TextBox nome = new TextBox();
	private final TextBox sobrenome = new TextBox();
	private final TextBox CPF = new TextBox();
	private final Boicotando.CaixaData dataNascimento = new Boicotando.CaixaData(-120, 0);
	private final RadioButton sexoFeminino = new RadioButton("sexo", "Feminino");
	private final RadioButton sexoMasculino = new RadioButton("sexo", "Masculino");
	private final HorizontalPanel boxSexo = new HorizontalPanel();
	private final TextBox DDDFone = new TextBox();
	private final TextBox numeroFone = new TextBox();
	private final HorizontalPanel boxFone = new HorizontalPanel();
	private final TextBox DDDFone2 = new TextBox();
	private final TextBox numeroFone2 = new TextBox();
	private final HorizontalPanel boxFone2 = new HorizontalPanel();
	private final TextBox DDDCelular = new TextBox();
	private final TextBox numeroCelular = new TextBox();
	private final HorizontalPanel boxCelular = new HorizontalPanel();
	//TODO: Validar e-mails já cadastrados. 
	private final TextBox email = new TextBox();
	private final TextBox emailConfirmacao = new TextBox();
	private final PasswordTextBox senha = new PasswordTextBox();
	private final PasswordTextBox senhaConfirmacao = new PasswordTextBox();
	private final Button loginButton = new Button("Efetuar login");
	private final Button novaSenhaButton = new Button("Alterar Senha");
	private final Button voltarButton = new Button("Voltar");
	private final Button confirmarButton = new Button("Confirmar");

	
	public TelaCadastroCliente()  {
		configuraElementos();
		gerenciaEventos();
		carregaDados();
		
		initWidget(panel);
	}
	
	public Cliente getValor() {
		char chars[] = {'.', '-'};
		Cliente cliente = new Cliente();
		if (idCliente != null) {
			cliente.setId(idCliente);
		}
		if (sexoFeminino.getValue()) {
			cliente.setSexo(Sexo.F);
		} else {
			cliente.setSexo(Sexo.M);
		}
		cliente.setCPF(Util.strRemove(CPF.getValue(), chars));
		cliente.setDataNascimento(dataNascimento.getValor());
		cliente.setEmail(email.getValue());
		cliente.setNome(nome.getValue());
		cliente.setNumeroCelular(DDDCelular.getValue() + "-" + numeroCelular.getValue());
		cliente.setNumeroFone(DDDFone.getValue() + "-" + numeroFone.getValue());
		cliente.setNumeroFone2(DDDFone2.getValue() + "-" + numeroFone2.getValue());
		cliente.setSenha(senha.getValue());
		cliente.setSobrenome(sobrenome.getValue());
		cliente.setEndereco(new Endereco());
		return cliente;
	}
	
	public void setValor(Cliente cliente) {
		if (cliente == null) {
			idCliente = null;
			nome.setValue(null);
			sobrenome.setValue(null);
			CPF.setValue(null);
			dataNascimento.setValor(null);
			sexoFeminino.setValue(false);
			sexoMasculino.setValue(false);
			DDDFone.setValue(null);
			numeroFone.setValue(null);
			DDDFone2.setValue(null);
			numeroFone2.setValue(null);
			DDDCelular.setValue(null);
			numeroCelular.setValue(null);
		} else {
			String fone[];
			idCliente = cliente.getId();
			nome.setValue(cliente.getNome());
			sobrenome.setValue(cliente.getSobrenome());
			CPF.setValue(Util.strFormata(cliente.getCPF(), "000.000.000-00"));
			dataNascimento.setValor(cliente.getDataNascimento());
			sexoFeminino.setValue(cliente.getSexo().equals(Sexo.F));
			sexoMasculino.setValue(cliente.getSexo().equals(Sexo.M));
			if (cliente.getNumeroFone() != null) {
				fone = cliente.getNumeroFone().split("-"); 
				if (fone.length == 2) {
					DDDFone.setValue(fone[0]);
					numeroFone.setValue(fone[1]);
				} else if (fone.length > 0) {
					numeroFone.setValue(fone[0]);
				}
			}
			if (cliente.getNumeroFone2() != null) {
				fone = cliente.getNumeroFone2().split("-"); 
				if (fone.length == 2) {
					DDDFone2.setValue(fone[0]);
					numeroFone2.setValue(fone[1]);
				} else if (fone.length > 0) {
					numeroFone2.setValue(fone[0]);
				}
			}
			if (cliente.getNumeroCelular() != null) {
				fone = cliente.getNumeroCelular().split("-"); 
				if (fone.length == 2) {
					DDDCelular.setValue(fone[0]);
					numeroCelular.setValue(fone[1]);
				} else if (fone.length > 0) {
					numeroCelular.setValue(fone[0]);
				}
			}
			email.setValue(cliente.getEmail());
			emailConfirmacao.setValue(cliente.getEmail());
		}		
		senha.setValue(null);
		senhaConfirmacao.setValue(null);
	}
	
	private void carregaDados() {
		gerenciadorCliente.getUsuarioAtivo(new AsyncCallback<Cliente>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Não foi possível resgatar os dados do cliente:" + caught.getMessage());
			}

			@Override
			public void onSuccess(Cliente cliente) {
				setValor(cliente);
				montaLayout();
			}
		});
	}
	
	private void configuraElementos() {
		loginEMail.getElement().setAttribute("size", "50");
		loginEMail.getElement().setAttribute("maxLength", "50");

		loginSenha.getElement().setAttribute("size", "20");
		loginSenha.getElement().setAttribute("maxLength", "20");

		nome.getElement().setAttribute("size", "60");
		nome.getElement().setAttribute("maxLength", "60");

		sobrenome.getElement().setAttribute("size", "60");
		sobrenome.getElement().setAttribute("maxLength", "60");

		CPF.getElement().setAttribute("size", "14");
		CPF.getElement().setAttribute("maxLength", "14");
		
		DDDFone.getElement().setAttribute("size", "2");
		DDDFone.getElement().setAttribute("maxLength", "2");
		
		numeroFone.getElement().setAttribute("size", "8");
		numeroFone.getElement().setAttribute("maxLength", "8");
		
		DDDFone2.getElement().setAttribute("size", "2");
		DDDFone2.getElement().setAttribute("maxLength", "2");

		numeroFone2.getElement().setAttribute("size", "8");
		numeroFone2.getElement().setAttribute("maxLength", "8");
		
		DDDCelular.getElement().setAttribute("size", "2");
		DDDCelular.getElement().setAttribute("maxLength", "2");
		
		numeroCelular.getElement().setAttribute("size", "8");
		numeroCelular.getElement().setAttribute("maxLength", "8");
		
		email.getElement().setAttribute("size", "50");
		email.getElement().setAttribute("maxLength", "50");
		
		emailConfirmacao.getElement().setAttribute("size", "50");
		emailConfirmacao.getElement().setAttribute("maxLength", "50");
		
		senha.getElement().setAttribute("size", "20");
		senha.getElement().setAttribute("maxLength", "20");
		
		senhaConfirmacao.getElement().setAttribute("size", "20");
		senhaConfirmacao.getElement().setAttribute("maxLength", "20");
	}
	
	private void gerenciaEventos() {
		CPF.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		CPF.addChangeHandler(Boicotando.CHANGE_HANDLER_VALIDA_CPF);

		DDDFone.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		
		numeroFone.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		
		DDDFone2.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);

		numeroFone2.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		
		DDDCelular.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		
		numeroCelular.addKeyPressHandler(Boicotando.KEY_PRESS_HANDLER_VALIDA_NUMERO);
		
		loginButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if (loginEMail.getValue() == null || loginEMail.getValue().isEmpty()) {
					loginEMail.setFocus(true);
					Window.alert("Informe seu e-mail.");
					return;
				} 
				if (loginSenha.getValue() == null || loginSenha.getValue().isEmpty()) {
					loginSenha.setFocus(true);
					Window.alert("Informe sua senha de acesso.");
					return;
				}
				
				gerenciadorCliente.login(loginEMail.getValue(), loginSenha.getValue(), new AsyncCallback<Boolean>() {
					@Override
					public void onSuccess(Boolean result) {
						if (result.booleanValue()) {
							Boicotando.exibeTela(Boicotando.Tela.SELECAO_PRODUTO);
						} else {
							Window.alert("Identificação inválida.");
						}
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Window.alert("Não foi possivel efetuar o login: " + caught.getMessage());
					}
				});
			}
		});
		
		novaSenhaButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if (senha.getValue() == null || senha.getValue().isEmpty()) {
					Window.alert("Informe a senha.");
					senha.setFocus(true);
					return;
				}
				if (senhaConfirmacao.getValue() == null || senhaConfirmacao.getValue().isEmpty()) {
					Window.alert("Informe a senha de confirmação.");
					senhaConfirmacao.setFocus(true);
					return;
				}
				if (!senhaConfirmacao.getValue().equals(senha.getValue())) {
					Window.alert("A nova senha informada não confere com a senha de confirmação.");
					email.setFocus(true);
					return;					
				}
				
				gerenciadorCliente.alteraSenha(loginSenha.getValue(), senha.getValue(), new AsyncCallback<Cliente>() {
					@Override
					public void onSuccess(Cliente result) {
						if (result == null) {
							Window.alert("Senha de cliente inválida.");
						} else {
							Window.alert("Sua senha foi alterada com sucesso!");
							Boicotando.exibeTela(Boicotando.Tela.SELECAO_PRODUTO);
						}
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Window.alert("Não foi possivel efetuar a alteração de senha: " + caught.getMessage());
					}
				});
			}
		});

		voltarButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				Boicotando.exibeTela(Boicotando.Tela.SELECAO_PRODUTO);
			}
		});

		confirmarButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				Cliente cliente = getValor();
				if (email.getValue() == null || email.getValue().isEmpty()) {
					Window.alert("Informe o e-mail.");
					email.setFocus(true);
					return;
				}
				if (emailConfirmacao.getValue() == null || emailConfirmacao.getValue().isEmpty()) {
					Window.alert("Informe o e-mail de confirmação.");
					emailConfirmacao.setFocus(true);
					return;
				}
				if (!emailConfirmacao.getValue().equals(email.getValue())) {
					Window.alert("O e-mail informado não confere com o e-mail de confirmação.");
					email.setFocus(true);
					return;					
				}
				if (idCliente == null) {
					if (senha.getValue() == null || senha.getValue().isEmpty()) {
						Window.alert("Informe a senha.");
						senha.setFocus(true);
						return;
					}
					if (senhaConfirmacao.getValue() == null || senhaConfirmacao.getValue().isEmpty()) {
						Window.alert("Informe a senha de confirmação.");
						senhaConfirmacao.setFocus(true);
						return;
					}
					if (!senhaConfirmacao.getValue().equals(senha.getValue())) {
						Window.alert("A senha informada não confere com a senha de confirmação.");
						email.setFocus(true);
						return;					
					}
				}
				if (numeroFone.getValue() == null || numeroFone.getValue().isEmpty()) {
					Window.alert("Informe o fone fixo.");
					DDDFone.setFocus(true);
					return;										
				}
				if (!sexoFeminino.getValue() && !sexoMasculino.getValue()) {
					sexoFeminino.setFocus(true);
					Window.alert("O sexo deve ser informado.");
					return;
				}
				if (idCliente == null) {
					gerenciadorCliente.cadastraCliente(cliente, new AsyncCallback<Cliente>() {
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("Erro ao cadastrar cliente: " + caught.getMessage());
						}
	
						@Override
						public void onSuccess(Cliente result) {
							Boicotando.exibeTela(Boicotando.Tela.SELECAO_PRODUTO);
						}
					});
				} else {
					gerenciadorCliente.alteraCliente(cliente, new AsyncCallback<Cliente>() {
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("Erro ao alterar cliente: " + caught.getMessage());
						}
	
						@Override
						public void onSuccess(Cliente result) {
							if (result == null) {
								Window.alert("Lamento, mas não foi possível liberar seu cadastro para alteração. Tente novamente mais tarde.");
							} else {
								Window.alert("Seu perfil foi alterado com sucesso!");
								Boicotando.exibeTela(Boicotando.Tela.SELECAO_PRODUTO);
							}
						}
					});					
				}
			}
		});
	}

	private void montaLayout() {
		loginForm.setStyleName("formulario", true);
		loginForm.setWidth("100%");
		
		clienteForm.setStyleName("formulario", true);
		clienteForm.setWidth("100%");
		
		loginTable.setWidth("100%");
		
		clienteTable.setWidth("100%");
		
		loginTitulo.setStyleName("titulo", true);
		if (idCliente == null) {
			loginTitulo.setHTML("<h3>Já sou cliente</h3>");
		} else {
			loginTitulo.setHTML("<h3>Quero alterar minha senha</h3>");
		}
		
		clienteTitulo.setStyleName("titulo", true);
		if (idCliente == null) {
			clienteTitulo.setHTML("<h3>Quero ser cliente</h3>");
		} else {
			clienteTitulo.setHTML("<h3>Quero alterar meu perfil</h3>");
		}
		
		clienteDadosTitulo.setStyleName("titulo", true);
		
		clienteLoginTitulo.setStyleName("titulo", true);
		
		panel.setWidth("100%");
		
		loginTable.setWidget(0, 0, loginTitulo);
		if (idCliente == null) {
			loginTable.setWidget(1, 0, new Label("Para acessar sua conta, por favor, informe os campos abaixo:"));
			loginTable.setWidget(3, 0, new Label("E-mail:"));
			loginTable.setWidget(3, 1, loginEMail);
			loginTable.setWidget(4, 0, new Label("Senha de cliente:"));
			loginTable.setWidget(4, 1, loginSenha);
			loginTable.setWidget(6, 0, loginButton);
		} else {
			loginTable.setWidget(1, 0, new Label("Para alterar sua senha, por favor, informe os campos abaixo:"));			
			loginTable.setWidget(3, 0, new Label("Senha de cliente:"));
			loginTable.setWidget(3, 1, loginSenha);
			loginTable.setWidget(4, 0, new Label("Nova senha:"));
			loginTable.setWidget(4, 1, senha);
			loginTable.setWidget(5, 0, new Label("Nova senha Confirmação:"));
			loginTable.setWidget(5, 1, senhaConfirmacao);
			loginTable.setWidget(6, 0, novaSenhaButton);
		}
		loginTable.getFlexCellFormatter().setColSpan(0, 0, 2);
		loginTable.getFlexCellFormatter().setColSpan(1, 0, 2);
		loginTable.getFlexCellFormatter().setAlignment(3, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		loginTable.getFlexCellFormatter().setAlignment(4, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		loginTable.getFlexCellFormatter().setAlignment(5, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		loginTable.getFlexCellFormatter().setColSpan(6, 0, 2);
		loginTable.getFlexCellFormatter().setAlignment(6, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		
		loginForm.add(loginTable);

		boxSexo.add(sexoFeminino);
		boxSexo.add(sexoMasculino);
		
		boxFone.add(DDDFone);
		boxFone.add(numeroFone);
		boxFone.add(new Label("(DDD NUMERO)"));
		
		boxFone2.add(DDDFone2);
		boxFone2.add(numeroFone2);
		boxFone2.add(new Label("(DDD NUMERO)"));
		
		boxCelular.add(DDDCelular);
		boxCelular.add(numeroCelular);
		boxCelular.add(new Label("(DDD NUMERO)"));
				
		clienteTable.setWidget(0, 0, clienteTitulo);
		clienteTable.setWidget(1, 0, new Label("Por favor, preencha os dados abaixo para criar sua conta. Os campos com * são obrigatórios."));
		clienteTable.setWidget(3, 0, clienteDadosTitulo);
		clienteTable.setWidget(5, 0, new Label("Nome * :"));
		clienteTable.setWidget(5, 1, nome);
		clienteTable.setWidget(6, 0, new Label("Sobrenome * :"));
		clienteTable.setWidget(6, 1, sobrenome);
		clienteTable.setWidget(7, 0, new Label("CPF * :"));
		clienteTable.setWidget(7, 1, CPF);
		clienteTable.setWidget(8, 0, new Label("Data de nascimento * :"));
		clienteTable.setWidget(8, 1, dataNascimento);
		clienteTable.setWidget(9, 0, new Label("Sexo * :"));
		clienteTable.setWidget(9, 1, boxSexo);
		clienteTable.setWidget(10, 0, new Label("Telefone fixo 1 * :"));
		clienteTable.setWidget(10, 1, boxFone);
		clienteTable.setWidget(11, 0, new Label("Telefone fixo 2:"));
		clienteTable.setWidget(11, 1, boxFone2);
		clienteTable.setWidget(12, 0, new Label("Celular:"));
		clienteTable.setWidget(12, 1, boxCelular);
		clienteTable.setWidget(14, 0, clienteLoginTitulo);
		clienteTable.setWidget(16, 0, new Label("E-mail * :"));
		clienteTable.setWidget(16, 1, email);
		clienteTable.setWidget(17, 0, new Label("Confirmação e-mail * :"));
		clienteTable.setWidget(17, 1, emailConfirmacao);
		if (idCliente == null) {
			clienteTable.setWidget(18, 0, new Label("Senha * :"));
			clienteTable.setWidget(18, 1, senha);
			clienteTable.setWidget(19, 0, new Label("Senha Confirmação * :"));
			clienteTable.setWidget(19, 1, senhaConfirmacao);
		}
		clienteTable.setWidget(21, 0, voltarButton);
		clienteTable.setWidget(21, 1, confirmarButton);
		
		clienteTable.getFlexCellFormatter().setColSpan(0, 0, 2);
		clienteTable.getFlexCellFormatter().setColSpan(1, 0, 2);
		clienteTable.getFlexCellFormatter().setColSpan(3, 0, 2);
		clienteTable.getFlexCellFormatter().setAlignment(3, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(5, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(6, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(7, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(8, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(9, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(10, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(11, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(12, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setColSpan(14, 0, 2);
		clienteTable.getFlexCellFormatter().setAlignment(16, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(17, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		if (idCliente == null) {
			clienteTable.getFlexCellFormatter().setAlignment(18, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
			clienteTable.getFlexCellFormatter().setAlignment(19, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		}
		clienteTable.getFlexCellFormatter().setAlignment(21, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteTable.getFlexCellFormatter().setAlignment(21, 1, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		clienteForm.add(clienteTable);
		
		panel.add(loginForm);
		panel.add(clienteForm);
		panel.setCellWidth(loginForm, "50%");
		panel.setCellWidth(clienteForm, "50%");		
	}
	
}
